#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

//int main()
int main(int argc,char* argv[])
{
    printf("hello printf\n");
    fprintf(stdout,"hello fprintf\n");
    const char* s = "hello fputs\n";
    
    fputs(s,stdout);

    const char* ss = "hello write\n";
    write(1,ss,strlen(ss));
    fflush(stdout);
    fork();

    ////输入重定向
    //int fd = open("log.txt",O_RDONLY);
    //if(fd < 0)
    //{
    //    perror("open\n");
    //    exit(1);
    //}

    //char buffer[64];
    //dup2(fd,0);
    ////fgets(buffer,sizeof buffer,stdin);
    //fscanf(stdin,"%s",buffer);
    //printf("%s\n",buffer);
    //close(fd);


    //if(argc != 2)
    //{
    //    printf("Option less than 2!\n");
    //    exit(1);
    //}

    ////追加重定向实现
    //int fd = open("log.txt",O_WRONLY|O_CREAT|O_APPEND,0666); 
    //
    ////输出重定向实现
    ////int fd = open("log.txt",O_WRONLY|O_CREAT|O_TRUNC); 
    //if(fd < 0)
    //{
    //    perror("open\n");
    //    return 1;
    //}
    //dup2(fd,1);
    //fprintf(stdout,"%s\n",argv[1]);

    //close(fd);



    //类似追加重定向
    //close(1);

    //int fd = open("log.txt",O_WRONLY|O_APPEND|O_CREAT);

    //if(fd < 0)
    //{
    //    perror("open");
    //    return 1;
    //}

    //fprintf(stdout,"you can see me!\n");


    //类似输入重定向，把0文件描述符，从stdin改为fd中打开的log.txt，
    //把本来从stdin中获取的数据，改为从fd中获取
    //close(0);

    //int fd = open("log.txt",O_RDONLY);

    //if(fd < 0)
    //{
    //    perror("open");
    //    return 1;
    //}

    //printf("fd: %d\n",fd);

    //char buffer[64];
    //fgets(buffer,sizeof buffer,stdin);

    //printf("%s\n",buffer);

    


    ////类似输出重定向，把文件描述符1的文件，从stdout改为fd打开的log.txt
    //close(1);

    //int fd = open("log.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);

    //if(fd < 0)
    //{
    //    perror("open");
    //    return 1;
    //}

    //printf("fd :%d\n",fd);
    //printf("fd :%d\n",fd);
    //printf("fd :%d\n",fd);
    //printf("fd :%d\n",fd);
    //printf("fd :%d\n",fd);
    //printf("fd :%d\n",fd);
    //
    //fprintf(stdout,"hello fprintf\n");
    //const char* s = "hello fwrite\n";

    //fwrite(s,strlen(s),1,stdout);


    //fflush(stdout);
    //close(fd);
    return 0;
}




//int main()
//{
//
//    printf("stdin: %d\n",stdin->_fileno);
//    printf("stdout: %d\n",stdout->_fileno);
//    printf("stderr: %d\n",stderr->_fileno);
//
//    //char input[16];
//    //ssize_t s = read(0,input,sizeof(input));
//
//    //if(s>0)
//    //{
//    //    input[s] = '\0';
//    //    printf("%s",input);
//    //}
//
//
//    //int a = 10;
//    //fscanf(stdin,"%d",&a);
//    
//    //fprintf(stdout,"hello stdout\n");
//    //const char* s = "hello 1\n";
//    //write(1,s,strlen(s));
//
//    //int fd1 = open("log1.txt",O_WRONLY | O_CREAT | O_APPEND,0666);
//    //printf("open success,fd:%d\n",fd1);
//    
//    //int fd2 = open("log2.txt",O_WRONLY | O_CREAT | O_APPEND,0666);
//    //printf("open success,fd:%d\n",fd2);
//    
//    //int fd3 = open("log3.txt",O_WRONLY | O_CREAT | O_APPEND,0666);
//    //printf("open success,fd:%d\n",fd3);
//
//    //close(fd1);
//    //close(fd2);
//    //close(fd3);
//
//
//    //int fd = open("log.txt",O_WRONLY | O_CREAT);
//    //int fd = open("log.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);//三个选项，路径，读写创建，文件的权限
//    //int fd = open("log.txt",O_WRONLY | O_CREAT | O_APPEND,0666);
//
//    //int fd = open("log.txt",O_RDONLY,0666);
//    //if(fd < 0)
//    //{
//    //    perror("open");
//    //    exit(1);
//    //}
//
//    //printf("open success,%d\n",fd);
//
//    //写操作
//    //const char* s = "haaaa write!\n";
//    //const char* s = "dd\n";
//
//    //write(fd,s,strlen(s));
//
//    //读操作
//    //char buffer[64];
//    //memset(buffer,'\0',sizeof(buffer));
//    //read(fd,buffer,sizeof(buffer));
//
//    //printf("%s",buffer);
//
//    //close(fd);
//    return 0;
//}


////测试简单的传递多个选项的代码
//#define ONE 0x01    //0000 0001
//#define TWO 0x02    //0000 0010
//#define THREE 0x04  //0000 0100
//
//int show(int flag)
//{
//    if(flag & ONE) printf("haaaa one\n");
//    
//    if(flag & TWO) printf("haaaa two\n");
//
//    if(flag & THREE) printf("haaaa three\n");
//}
//
//int main()
//{
//    show(ONE);
//    printf("-------------\n");
//    show(TWO);
//    printf("-------------\n");
//    show(THREE);
//    printf("-------------\n");
//    show(TWO|THREE);
//    printf("-------------\n");
//    show(ONE | TWO | THREE);
//    printf("-------------\n");
//
//    return 0;
//}


//int main(int argc,char* argv[])
//{
//    if(argc != 2)
//    {
//        printf("argc error!\n");
//        exit(1);
//    }
//
//
//    FILE* fp = fopen(argv[1],"r");
//
//    //FILE* fp = fopen("log.txt","r");
//    if(fp == NULL)
//    {
//        perror("fopen");
//        exit(2);
//    }
//
//    char line[64]; 
//    
//    while(fgets(line,sizeof line ,fp) != NULL)
//    {
//        fprintf(stdout,"%s",line);
//    }
//    
//    //const char* s1 = "hello fwrite\n";
//    //fwrite(s1,strlen(s1),1,fp);
//
//    //const char* s2 = "hello fprintf\n";
//    //fprintf(fp,"%s",s2);
//
//    //const char* s3 = "hello fputs\n";
//    //fputs(s3,fp);
//
////    while(1)
////    {
////        sleep(1);
////    }
//
//    fclose(fp);
//
//    return 0;
//}
